package br.com.mobimenu.business.impl;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import br.com.mobimenu.business.UsuarioService;
import br.com.mobimenu.business.impl.validatores.Validator;
import br.com.mobimenu.exception.NegociosException;
import br.com.mobimenu.exception.message.ErrorMensagemEnum;
import br.com.mobimenu.model.impl.Usuario;
import br.com.mobimenu.persistence.DAO.UsuarioDAO;
import br.com.mobimenu.persistence.filter.impl.FiltroUsuario;

@Service
public class UsuarioServiceImpl extends ServiceGeneric<Usuario, Long, FiltroUsuario, UsuarioDAO> implements UsuarioService {

	@Autowired
	private UsuarioDAO usuarioDAO;

	public UsuarioServiceImpl() {

	}

	@Override
	public UsuarioDAO getRepositorioDAO() {
		return this.usuarioDAO;
	}

	@Override
	public Usuario getUsuarioSistema() {
		Usuario usuario = null;
		FiltroUsuario filtro = new FiltroUsuario();
		filtro.addEquals(FiltroUsuario.SISTEMA, true);
		Collection<Usuario> usuarios = this.consultar(filtro);
		for (Usuario usuarioSyst : usuarios) {
			usuario = usuarioSyst;
		}
		return usuario;
	}

	@Override
	public void resolverPerDependencias(Usuario vo, Usuario usuario) {

	}

	@Override
	public void resolverPosDependencias(Usuario vo, Usuario usuario) {

	}

	@Override
	public void resolverPreExcluir(Usuario vo) {

	}

	public void setUsuarioDAO(UsuarioDAO usuarioDAO) {
		this.usuarioDAO = usuarioDAO;
	}

	@Override
	public void tratarDadosEntidade(Usuario vo) {

	}

	@Override
	public void validarAlteracao(Usuario vo) {
		List<NegociosException> exceptions = new ArrayList<NegociosException>();
		this.validatEntidade(vo, exceptions);
		if(exceptions.size() > 0){
			throw new NegociosException(exceptions);
		}
	}

	@Override
	public void validarExclusao(Usuario vo) {
		if(vo.isSistema()){
			throw new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_SISTEMA_USUARIO_EXCLUIR);
		}
	}

	@Override
	public void validarInclusao(Usuario vo) {
		List<NegociosException> exceptions = new ArrayList<NegociosException>();
		this.validatEntidade(vo, exceptions);
		if(exceptions.size() > 0){
			throw new NegociosException(exceptions);
		}
	}

	public void validarLogin(Usuario vo) {

	}

	@Override
	public void validarUnicidade(Usuario vo) {
		if(vo.getId() == null){
			this.validarUnicidadeInclusao(vo);
		}else{
			this.validarUnicidadeAlteracao(vo);
		}
	}

	public void validarUnicidadeAlteracao(Usuario vo){
		Usuario usuarioAtu = this.getRepositorioDAO().buscar(vo.getId());

		FiltroUsuario filtro = new FiltroUsuario();
		filtro.addEquals(FiltroUsuario.USERNAME, vo.getUsername());

		Collection<Usuario> lista = this.getRepositorioDAO().consultar(filtro);
		for (Usuario usuario : lista) {
			if(!usuario.getUsername().equals(usuarioAtu.getUsername())){
				throw new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_EXISTENTE, "login");
			}
		}
	}

	public void validarUnicidadeInclusao(Usuario vo){
		FiltroUsuario filtro = new FiltroUsuario();
		filtro.addEquals(FiltroUsuario.USERNAME, vo.getUsername());
		Collection<Usuario> lista = this.getRepositorioDAO().consultar(filtro);
		if(lista.size() > 0){
			throw new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_EXISTENTE, "Login");
		}
	}

	public void validatEntidade(Usuario vo, List<NegociosException> exceptions) {

		if(vo.isSistema()){
			exceptions.add(new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_SISTEMA_USUARIO_MODIFICADO));
		}

		if(!Validator.validartStringNull(vo.getNome())){
			exceptions.add(new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_OBRIGATORIO, "usuario"));
		}

		if(!Validator.validartStringNull(vo.getEmail())){
			exceptions.add(new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_OBRIGATORIO, "email"));
		}

		if(!Validator.validartStringNull(vo.getUsername())){
			exceptions.add(new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_OBRIGATORIO, "login"));
		}

		if(!Validator.validartStringNull(vo.getPassword())){
			exceptions.add(new NegociosException(ErrorMensagemEnum.ERROR_CAMPO_OBRIGATORIO, "senha"));
		}

	}

}
